﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace umaStudy_VB.NETtoCSharp
{
    class Program
    {
        /// <summary>
        /// static(VBではshared)はインスタンスを生成することなく呼ぶことができる。
        /// 逆にstaticはクラスから直接呼ぶためクラス内のメソッドは呼ぶことができない。
        /// したがってMainのなかではインスタンスを生成するまではTimingTest()を呼ぶことはできない
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args) //
        {
            Program newprog = new Program();
            newprog.TimingTest();
            Trace.WriteLine("1)の結果を確認--------------------------------");
            Class2 kaji = new Class2("kajiwara", "24");

            kaji.OutputData();
            Trace.WriteLine("2)の結果を確認--------------------------------");
            interface3 intaf;
            intaf = new Class4();
            intaf.OutputMessage("WakeUp");
            Trace.WriteLine("3)の結果を確認--------------------------------");

            Class5 obj2 = new Class5();
            obj2.I = 3;
            Trace.WriteLine(obj2.I);
            obj2.Str = "Message";
            Trace.WriteLine(obj2.Str);
            obj2.Obj = args[0];
            Trace.WriteLine(obj2.Obj);
        }
        private void TimingTest()
        {
            Class1 newobj = new Class1();
            Trace.WriteLine("Class1インスタンスが生成されました");
            newobj.TestMethod();
        }
    }
    class Class1
    {
        public Class1() //コンストラクタの設定の仕方がVB.NETとC#では違うので注意
        {
            Trace.WriteLine("Class1()コンストラクタが呼ばれました");
        }
        ~Class1() //Finalize処理はC#で書くとこのようになる。　まじで！？
        {
            Trace.WriteLine("Class1()Finalizeが呼ばれました");
        }
        public void TestMethod()
        {
            Trace.WriteLine("TestNethodが呼ばれました");
        }
    }
    class Class2
    {
        private string name;
        private string age;
        public Class2(string n, string a)
        {
            name = n;
            age = a;
        }
        public void OutputData()
        {
            Trace.WriteLine(name);
            Trace.WriteLine(age);
        }

    }
    interface interface3
    {
        void OutputMessage(string msg);
    }
    class Class4 : interface3
    {               
        public void OutputMessage(string msg)
        {
            Trace.WriteLine(msg);
        }
    }
    class Class5
    {
        //ごくごく標準的なプロパティの書き方
        private int i;
        public int I
        {
            get
            {
                return this.i;
            }
            set
            {
                this.i = value;
            }
        }
        //C# 3.0からの記載方法
        public string Str { get; set; }
        public object Obj { get; set; }

            
    }
    
}
